<!DOCTYPE html>
<!-- saved from url=(0046)https://habr.com/ru/company/ruvds/blog/327896/ -->
<html lang="ru"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  
  <meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
  <title>Bash-скрипты, часть 9: регулярные выражения / Блог компании RUVDS.com / Хабр</title>
  <style>
    /* cyrillic-ext */
    @font-face {
      font-family: 'Fira Sans';
      font-style: normal;
      font-weight: 500;
      font-display: swap;
      src: url(https://fonts.gstatic.com/s/firasans/v11/va9B4kDNxMZdWfMOD5VnZKveSxf6TF0.woff2) format('woff2');
      unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
    }

    /* cyrillic */
    @font-face {
      font-family: 'Fira Sans';
      font-style: normal;
      font-weight: 500;
      font-display: swap;
      src: url(https://fonts.gstatic.com/s/firasans/v11/va9B4kDNxMZdWfMOD5VnZKveQhf6TF0.woff2) format('woff2');
      unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
    }

    /* latin-ext */
    @font-face {
      font-family: 'Fira Sans';
      font-style: normal;
      font-weight: 500;
      font-display: swap;
      src: url(https://fonts.gstatic.com/s/firasans/v11/va9B4kDNxMZdWfMOD5VnZKveSBf6TF0.woff2) format('woff2');
      unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
    }

    /* latin */
    @font-face {
      font-family: 'Fira Sans';
      font-style: normal;
      font-weight: 500;
      font-display: swap;
      src: url(https://fonts.gstatic.com/s/firasans/v11/va9B4kDNxMZdWfMOD5VnZKveRhf6.woff2) format('woff2');
      unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
    }
  </style>
  <link rel="preload" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/chunk-vendors.29e3fe9b.css" as="style"><link rel="preload" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/chunk-vendors.1ca41abb.js" as="script"><link rel="preload" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/app.b84b16a4.css" as="style"><link rel="preload" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/app.132461d8.js" as="script"><link rel="preload" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/about.428e0545.css" as="style"><link rel="preload" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/about.2d3fd602.js" as="script">
  <link rel="stylesheet" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/chunk-vendors.29e3fe9b.css"><link rel="stylesheet" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/app.b84b16a4.css"><link rel="stylesheet" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/about.428e0545.css">
  <script type="text/javascript" async="" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/js"></script><script async="" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/tag.js"></script><script async="" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/analytics.js"></script><script>window.i18nFetch = new Promise((res, rej) => {
          const xhr = new XMLHttpRequest();
          xhr.open('GET', '/js/i18n/ru-compiled.07ab3411a33038d0c6f862dbea0a2c45.json');
          xhr.responseType = 'json';
          xhr.onload = function(e) {
            if (this.status === 200) {
              res({ru: xhr.response});
            } else {
              rej(e);
            }
          };
          xhr.send();
        });</script>
  
  
  <script src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/gpt.js" async=""></script>
  <style>.grecaptcha-badge{visibility: hidden;}</style>
  <meta name="habr-version" content="2.45.0">
  
  <meta data-vue-meta="ssr" property="fb:app_id" content="444736788986613"><meta data-vue-meta="ssr" property="fb:pages" content="472597926099084"><meta data-vue-meta="ssr" name="twitter:card" content="summary_large_image"><meta data-vue-meta="ssr" name="twitter:site" content="@habr_eng"><meta data-vue-meta="ssr" property="og:locale" content="ru_RU" data-vmid="og:locale">
  
  <meta name="apple-mobile-web-app-status-bar-style" content="#303b44">
  <meta name="msapplication-TileColor" content="#629FBC">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="mobile-web-app-capable" content="yes">
  <link rel="shortcut icon" type="image/png" sizes="16x16" href="https://assets.habr.com/habr-web/img/favicons/favicon-16.png">
  <link rel="shortcut icon" type="image/png" sizes="32x32" href="https://assets.habr.com/habr-web/img/favicons/favicon-32.png">
  <link rel="apple-touch-icon" type="image/png" sizes="76x76" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-76.png">
  <link rel="apple-touch-icon" type="image/png" sizes="120x120" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-120.png">
  <link rel="apple-touch-icon" type="image/png" sizes="152x152" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-152.png">
  <link rel="apple-touch-icon" type="image/png" sizes="180x180" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-180.png">
  <link rel="apple-touch-icon" type="image/png" sizes="256x256" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-256.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_1136x640.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2436x1125.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_1792x828.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_828x1792.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_1334x750.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1242x2668.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2208x1242.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1125x2436.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1242x2208.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2732x2048.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2688x1242.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2224x1668.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_750x1334.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_2048x2732.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2388x1668.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1668x2224.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_640x1136.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1668x2388.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2048x1536.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1536x2048.png">
  <link rel="mask-icon" color="#77a2b6" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-120.svg">
  <link crossorigin="use-credentials" href="https://habr.com/manifest.webmanifest" rel="manifest">
<script charset="utf-8" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/chunk-2d0e544c.95c18ea8.js"></script><meta http-equiv="origin-trial" content="A88otRz1Fd3Nt567e2IYshC18LL3KGVXpVJW9oTCId4RYaygt23pbb4JqrbdIO/bwZPWEmRjBIRBu/bZbDR7Pg4AAABueyJvcmlnaW4iOiJodHRwczovL2ltYXNkay5nb29nbGVhcGlzLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MzQwODMxOTksImlzVGhpcmRQYXJ0eSI6dHJ1ZX0="><meta http-equiv="origin-trial" content="A0gCLbXCcL0R1Oc8tFPDs0G4Elz17w3zHp+Zst66+D17veE2o7fUcPsA114QtSTRqfVJLMeTSdeWOom0CcyCsgYAAAB7eyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MzQwODMxOTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><meta http-equiv="origin-trial" content="A9RQ+LxFazAousxUwSCzaihJjHLO1UyjQp0teZKHl7WdbVjPDfHSKMd6D/ZI5MTjqClFycbl70EFd7cBJWXqKQEAAACBeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MzQwODMxOTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><meta http-equiv="origin-trial" content="A6WKeWsdn1Ct+ZPqS9NCxxaiBoQ7wdTkK2/gE69Yu0gfBKJfo1gOvgkGmf5/xaIajT/RUb9AbnF1FsSZ47cCcQcAAACBeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MzQwODMxOTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><meta http-equiv="origin-trial" content="A04ZCu7yjrHgwQJK5ISHhH1DSg0qqowEay3n70KO6wV3D2Mj+OX3Kw20aSMitzgdG1xfrN7sOJV/dZIk+RvCzA4AAAB2eyJvcmlnaW4iOiJodHRwczovL2dvb2dsZS5jb206NDQzIiwiZmVhdHVyZSI6IlRydXN0VG9rZW5zIiwiZXhwaXJ5IjoxNjM0MDgzMTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlfQ=="><meta http-equiv="origin-trial" content="A2YAd4xOntTGygIDjApOTtXOgVI3IWsd5OnOGq3RbRkIQwyqYWNl1JGRAcvtm6VOHDj4n07T/J19VqLuJn3MmQ8AAACWeyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjMxNjYzOTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9"><meta http-equiv="origin-trial" content="A2c5Ux+hivdkLh/KbZUGr6f7SCR0mZrBVfPJ+/OuDVHNwiYv+Lo83b9z5qL8sod78bQl0pSLtbvRWURo+xRl7AIAAACceyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjMxNjYzOTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9"><meta http-equiv="origin-trial" content="AzNJ4sd3tVurolpdvWYZ4cmP9Po7RJhEHSqmC3pgxW9fFVZvchhtcMUgHAs97npxMD1jhXHO8s6q6Wy1MMLxKgEAAACceyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjMxNjYzOTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9"><meta http-equiv="origin-trial" content="AwfG8hAcHnPa/kJ1Co0EvG/K0F9l1s2JZGiDLt2mhC3QI5Fh4qmsmSwrWObZFbRC9ieDaSLU6lHRxhGUF/i9sgoAAACBeyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiSW50ZXJlc3RDb2hvcnRBUEkiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><meta http-equiv="origin-trial" content="AwQ7dCmHkvR6FuOFxAuNnktYSQrGbL4dF+eBkrwNLALc69Wr//PnO1yzns3pjUoCaYbKHtVcnng2hU+8OUm0PAYAAACHeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiSW50ZXJlc3RDb2hvcnRBUEkiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><meta http-equiv="origin-trial" content="AysVDPGQTLD/Scn78x4mLwB1tMfje5jwUpAAzGRpWsr1NzoN7MTFhT3ClmImi2svDZA7V6nWGIV8YTPsSRTe0wYAAACHeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiSW50ZXJlc3RDb2hvcnRBUEkiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><script src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/pubads_impl_2021082501.js" async=""></script><link rel="stylesheet" type="text/css" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/page-article_sandbox_user-articles-subpages.42ab304e.css"><script charset="utf-8" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/page-article_sandbox_user-articles-subpages.7c1dabd1.js"></script><link rel="stylesheet" type="text/css" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/page-article_page-company.c389b18d.css"><script charset="utf-8" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/page-article_page-company.8acf483a.js"></script><link rel="stylesheet" type="text/css" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/page-article.5e02c2f9.css"><script charset="utf-8" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/page-article.e4fcd1ed.js"></script><script data-vue-meta="ssr" onload="window[&#39;e0044d29c024&#39;] = true" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/saved_resource" data-vmid="checklogin"></script><script data-vue-meta="ssr" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/ads.js" onload="window[&#39;zhY4i4nJ9K&#39;] = true" data-vmid="checkad"></script><link rel="stylesheet" type="text/css" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/chunk-f458c7c4.7ecad03c.css"><script charset="utf-8" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/chunk-f458c7c4.529673c8.js"></script><script charset="utf-8" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/chunk-2d21ab85.a318b7bd.js"></script><script charset="utf-8" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/hljs.c67ce31f.js"></script><link rel="stylesheet" type="text/css" href="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/gallery.36fc9d2c.css"><script charset="utf-8" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/gallery.42a5862c.js"></script><script charset="utf-8" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/chunk-2d222042.0248dfe2.js"></script><script charset="utf-8" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/photoswipe.2b48f110.js"></script><link data-vue-meta="ssr" href="https://habr.com/ru/company/ruvds/blog/327896/" rel="canonical" data-vmid="canonical"><link data-vue-meta="ssr" href="https://habr.com/ru/rss/post/327896/?fl=ru" type="application/rss+xml" title="" rel="alternate" name="rss"><link data-vue-meta="ssr" data-vmid="hreflang"><link data-vue-meta="ssr" image_src="image" href="https://habr.com/share/publication/327896/2f326c084e1a4a2897ebc2d5126de70b/" data-vmid="image:href"><meta data-vue-meta="ssr" property="og:title" content="Bash-скрипты, часть 9: регулярные выражения" data-vmid="og:title"><meta data-vue-meta="ssr" name="twitter:title" content="Bash-скрипты, часть 9: регулярные выражения" data-vmid="twitter:title"><meta data-vue-meta="ssr" name="aiturec:title" content="Bash-скрипты, часть 9: регулярные выражения" data-vmid="aiturec:title"><meta data-vue-meta="ssr" name="description" content="Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи,..." data-vmid="description"><meta data-vue-meta="ssr" itemprop="description" content="Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи,..." data-vmid="description:itemprop"><meta data-vue-meta="ssr" property="og:description" content="Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи,..." data-vmid="og:description"><meta data-vue-meta="ssr" name="twitter:description" content="Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи,..." data-vmid="twitter:description"><meta data-vue-meta="ssr" property="aiturec:description" content="Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи,..." data-vmid="aiturec:description"><meta data-vue-meta="ssr" itemprop="image" content="https://habr.com/share/publication/327896/2f326c084e1a4a2897ebc2d5126de70b/" data-vmid="image:itemprop"><meta data-vue-meta="ssr" property="og:image" content="https://habr.com/share/publication/327896/2f326c084e1a4a2897ebc2d5126de70b/" data-vmid="og:image"><meta data-vue-meta="ssr" property="aiturec:image" content="https://habr.com/share/publication/327896/2f326c084e1a4a2897ebc2d5126de70b/" data-vmid="aiturec:image"><meta data-vue-meta="ssr" name="twitter:image" content="https://habr.com/share/publication/327896/2f326c084e1a4a2897ebc2d5126de70b/" data-vmid="twitter:image"><meta data-vue-meta="ssr" property="vk:image" content="https://habr.com/share/publication/327896/2f326c084e1a4a2897ebc2d5126de70b/" data-vmid="vk:image"><meta data-vue-meta="ssr" property="aiturec:item_id" content="327896" data-vmid="aiturec:item_id"><meta data-vue-meta="ssr" property="aiturec:datetime" content="2017-05-03T11:55:40.000Z" data-vmid="aiturec:datetime"><meta data-vue-meta="ssr" property="og:type" content="article" data-vmid="og:type"><meta data-vue-meta="ssr" property="og:image:width" content="1200" data-vmid="og:image:width"><meta data-vue-meta="ssr" property="og:image:height" content="630" data-vmid="og:image:height"><script data-vue-meta="ssr" type="application/ld+json" data-vmid="ldjson-schema">{"@context":"http:\/\/schema.org","@type":"Article","mainEntityOfPage":{"@type":"WebPage","@id":"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/327896\/"},"headline":"Bash-скрипты, часть 9: регулярные выражения","datePublished":"2017-05-03T14:55:40+03:00","dateModified":"2017-05-11T16:00:46+03:00","author":{"@type":"Person","name":"ru_vds"},"publisher":{"@type":"Organization","name":"Habr","logo":{"@type":"ImageObject","url":"https:\/\/habrastorage.org\/webt\/a_\/lk\/9m\/a_lk9mjkccjox-zccjrpfolmkmq.png"}},"description":"Bash-скрипты: начало Bash-скрипты, часть 2: циклы Bash-скрипты, часть 3: параметры и ключи командной строки Bash-скрипты, часть 4: ввод и вывод Bash-скрипты, час...","url":"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/327896\/#post-content-body","about":["c_ruvds","h_linux","h_sys_admin","f_admin"],"image":["https:\/\/habrastorage.org\/files\/803\/892\/bfe\/803892bfe548499aa763df324d40fd01.png","https:\/\/habrastorage.org\/files\/1ba\/550\/d25\/1ba550d25e8846ce8805de564da6aa63.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ce1\/51e\/066\/ce151e066cd663f4df98e840831073ca.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9de\/8f4\/b47\/9de8f4b471c6480e773c3de4301b5d0b.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a34\/14c\/d2c\/a3414cd2cb6e497e44544ea3fa306f1f.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/aab\/022\/60a\/aab02260a27124770cd425bd16c66a83.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2e2\/056\/628\/2e2056628c28fd1d141bf3cc9d7253a7.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/47a\/18f\/06c\/47a18f06c8a463f39d15da1f8bfd677a.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/066\/8a1\/e77\/0668a1e77511ed32970f60b26cd597e7.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/13d\/de2\/d8a\/13dde2d8afe39a863e124712188a95b2.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b64\/da5\/ad1\/b64da5ad11297c7f97de46f83dcda1da.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1fb\/810\/f9b\/1fb810f9bb775d412ae5c3748e78e42c.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6ee\/eba\/d80\/6eeebad801eeb799f1208331658ee6ef.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fbb\/a19\/a69\/fbba19a69e7814891f9d4c89e11c8414.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b9a\/040\/0d5\/b9a0400d5b963002ac59d3fc895f8f4f.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d15\/21b\/87b\/d1521b87b3ec1b32658b612b590c0f99.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4a5\/2d7\/200\/4a52d7200df95c30531ccc7a4a4924b1.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f84\/e0a\/644\/f84e0a6441893131f42b3892486d467d.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3d9\/f65\/8a2\/3d9f658a231a01771a5fc209b1cd086a.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ba4\/ae6\/853\/ba4ae6853c092785c6c9db33bee0e9d8.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/646\/f12\/8aa\/646f128aa44e661a023b6e721d81f020.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/810\/1e4\/48b\/8101e448b27a7c9cb9c56fc0434adc0a.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7e9\/999\/623\/7e99996235e70b1dc907315343ae9b01.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4e2\/386\/e8b\/4e2386e8bce40ead25463d12945199f0.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0f7\/04b\/9ad\/0f704b9ad0e6db2349a5257a35a42b8f.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fb8\/bbd\/4a6\/fb8bbd4a6cda3194f5438e44ec0d19a2.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/078\/f43\/49a\/078f4349a99b37584cfc11404d373178.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0b4\/3c8\/413\/0b43c8413d2fd63352a82d6cb3a1909e.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9e6\/6ae\/758\/9e66ae7580f900e395dd762497f36a39.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/be8\/fe3\/1e3\/be8fe31e3f05cf44b2176c9e300bbc74.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d64\/5c9\/a06\/d645c9a064e8c4af30d83ee3a21c6f56.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c77\/6a7\/78e\/c776a778eabbfcf0dd0a77f98c26175c.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4ac\/c40\/2e5\/4acc402e59676f3630b5b73d12ff7cfa.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7ba\/0c0\/3f5\/7ba0c03f5020b615812530ca2af99b13.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/88e\/e97\/03a\/88ee9703a9d01a0200e19f6bef7096b3.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3b5\/5b7\/4f1\/3b55b74f1cf11a6aafdbd4839413d31c.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c78\/c80\/df7\/c78c80df73aa2c9817f53df90a067ad8.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/75b\/6ef\/697\/75b6ef697cb8244cb70599f42d80c663.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9a5\/f01\/a60\/9a5f01a6058b364523a8241e5f35c344.png","https:\/\/habrastorage.org\/files\/1ba\/550\/d25\/1ba550d25e8846ce8805de564da6aa63.png"]}</script></head>
<body cz-shortcut-listen="true">


<div id="app" data-async-called="true"><div class="tm-layout__wrapper"><!----><div></div><!----><header class="tm-header"><div class="tm-page-width"><div class="tm-header__container"><!----><span class="tm-header__logo-wrap"><a href="https://habr.com/ru/" class="tm-header__logo tm-header__logo_ru"><svg height="16" width="16" class="tm-svg-img tm-header__icon"><title>Хабр</title><use xlink:href="/img/habr-logo-ru.svg#logo"></use></svg></a><span class="tm-header__beta-sign" style="display: none;">β</span></span><div class="tm-dropdown tm-header__projects"><div class="tm-dropdown__head"><button class="tm-header__dropdown-toggle"><svg height="16" width="16" class="tm-svg-img tm-header__icon tm-header__icon_dropdown"><title>Открыть список</title><use xlink:href="/img/megazord-v24.cee85629.svg#arrow-down"></use></svg></button></div><!----></div><a href="https://habr.com/ru/sandbox/start/" class="tm-header__become-author-btn">
              Как стать автором
            </a><!----><!----><div class="tm-header-user-menu tm-header_user-menu"><a href="https://habr.com/ru/search/" class="tm-header-user-menu__item tm-header-user-menu__search"><svg height="24" width="24" class="tm-svg-img tm-header-user-menu__icon tm-header-user-menu__icon_search"><title>Поиск</title><use xlink:href="/img/megazord-v24.cee85629.svg#search"></use></svg></a><!----><!----><!----><div class="tm-header-user-menu__item"><button data-test-id="menu-toggle-guest" class="tm-header-user-menu__toggle"><svg height="24" width="24" class="tm-svg-img tm-header-user-menu__icon tm-header-user-menu__icon_white"><title>Профиль</title><use xlink:href="/img/megazord-v24.cee85629.svg#header-user"></use></svg></button><!----></div><!----></div></div></div></header><div class="tm-layout"><div class="tm-page-progress-bar"></div><div class="tm-base-layout__header"><div class="tm-page-width"><div class="tm-base-layout__header-wrapper"><div class="tm-main-menu"><div class="tm-main-menu__section"><nav class="tm-main-menu__section-content"><!----><a href="https://habr.com/ru/all/" class="tm-main-menu__item">
        Все потоки
      </a><a href="https://habr.com/ru/flows/develop/" class="tm-main-menu__item">
          Разработка
        </a><a href="https://habr.com/ru/flows/admin/" class="tm-main-menu__item">
          Администрирование
        </a><a href="https://habr.com/ru/flows/design/" class="tm-main-menu__item">
          Дизайн
        </a><a href="https://habr.com/ru/flows/management/" class="tm-main-menu__item">
          Менеджмент
        </a><a href="https://habr.com/ru/flows/marketing/" class="tm-main-menu__item">
          Маркетинг
        </a><a href="https://habr.com/ru/flows/popsci/" class="tm-main-menu__item">
          Научпоп
        </a></nav></div></div><!----></div></div></div><!----><div class="tm-page-width tm-page-width_no-padding"></div><main class="tm-layout__container"><div class="tm-page" hl="ru" companyname="ruvds"><div class="tm-page-width tm-page-width_no-padding"><div class="tm-page__header"><div class="tm-company-card__branding"><!----><a href="https://ruvds.com/ru-rub"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/b778d5a41f83016379c6630262c3294c.png" width="100%" class="tm-company-card__branding-image"></a></div></div><div class="tm-page__wrapper"><div class="tm-page__main tm-page__main_has-sidebar"><div class="pull-down"><div class="pull-down__header" style="height: 0px;"><div class="pull-down__content" style="bottom: 10px;"><svg height="24" width="24" class="tm-svg-img pull-down__arrow"><title>Обновить</title><use xlink:href="/img/megazord-v24.cee85629.svg#pull-arrow"></use></svg></div></div><!----><div class="tm-page-article__body"><article class="tm-page-article__content tm-page-article__content_inner"><div class="tm-page-article__head-wrapper"><!----><div class="tm-article-snippet tm-page-article__snippet"><div class="tm-article-snippet__meta-container"><div class="tm-article-snippet__meta"><span class="tm-user-info tm-article-snippet__author"><a href="https://habr.com/ru/users/ru_vds/" class="tm-user-info__userpic" title="ru_vds"><div class="tm-entity-image"><img alt="" height="24" loading="lazy" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/e36812d3de38eb3d479d7a13228717ef.png" width="24" class="tm-entity-image__pic"></div></a><span class="tm-user-info__user"><a href="https://habr.com/ru/users/ru_vds/" class="tm-user-info__username">
      ru_vds
    </a></span></span><span class="tm-article-snippet__datetime-published"><time datetime="2017-05-03T11:55:40.000Z" title="2017-05-03, 18:55">3  мая  2017 в 18:55</time></span></div><!----></div><h1 lang="ru" class="tm-article-snippet__title tm-article-snippet__title_h1"><span>Bash-скрипты, часть 9: регулярные выражения</span></h1><div class="tm-article-snippet__hubs"><span class="tm-article-snippet__hubs-item"><a href="https://habr.com/ru/company/ruvds/blog/" class="tm-article-snippet__hubs-item-link router-link-active"><span>Блог компании RUVDS.com</span><!----></a></span><span class="tm-article-snippet__hubs-item"><a href="https://habr.com/ru/hub/linux/" class="tm-article-snippet__hubs-item-link"><span>Настройка Linux</span><span title="Профильный хаб" class="tm-article-snippet__profiled-hub">*</span></a></span><span class="tm-article-snippet__hubs-item"><a href="https://habr.com/ru/hub/sys_admin/" class="tm-article-snippet__hubs-item-link"><span>Системное администрирование</span><span title="Профильный хаб" class="tm-article-snippet__profiled-hub">*</span></a></span></div><div class="tm-article-snippet__labels"><div class="tm-article-snippet__label"><span>
          Перевод
        </span></div></div><!----><!----></div></div><div class="tm-page-article__origin"><a href="https://likegeeks.com/regex-tutorial-linux/" target="_blank" class="tm-page-article__origin-link">
                Автор оригинала:
                <span class="tm-page-article__origin-value">
                  Администратор likegeeks.com
                </span></a></div><div data-gallery-root="" class="tm-article-body" lang="ru"><div class="article-formatted-body article-formatted-body_version-1" id="post-content-body"><div xmlns="http://www.w3.org/1999/xhtml"><blockquote><a href="https://habrahabr.ru/company/ruvds/blog/325522/">Bash-скрипты: начало</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/325928/">Bash-скрипты, часть 2: циклы</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/326328/">Bash-скрипты, часть 3: параметры и ключи командной строки</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/326594/">Bash-скрипты, часть 4: ввод и вывод</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/326826/">Bash-скрипты, часть 5: сигналы, фоновые задачи, управление сценариями</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/327248/">Bash-скрипты, часть 6: функции и разработка библиотек</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/327530/">Bash-скрипты, часть 7: sed и обработка текстов</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/327754/">Bash-скрипты, часть 8: язык обработки данных awk</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/327896/">Bash-скрипты, часть 9: регулярные выражения</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/328346/">Bash-скрипты, часть 10: практические примеры</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/328436/">Bash-скрипты, часть 11: expect и автоматизация интерактивных утилит</a></blockquote><br>
Для того, чтобы полноценно обрабатывать тексты в bash-скриптах с помощью sed и awk, просто необходимо разобраться с регулярными выражениями. Реализации этого полезнейшего инструмента можно найти буквально повсюду, и хотя устроены все регулярные выражения схожим образом, основаны на одних и тех же идеях, в разных средах работа с ними имеет определённые особенности. Тут мы поговорим о регулярных выражениях, которые подходят для использования в сценариях командной строки Linux.<br>
<br>
<a href="https://habrahabr.ru/company/ruvds/blog/327896/"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/files/803/892/bfe/803892bfe548499aa763df324d40fd01.png"></a><br>
<br>
Этот материал задуман как введение в регулярные выражения, рассчитанное на тех, кто может совершенно не знать о том, что это такое. Поэтому начнём с самого начала.<br>
<a name="habracut"></a><br>
<a href="https://ruvds.com/ru-rub/#order"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/files/1ba/550/d25/1ba550d25e8846ce8805de564da6aa63.png"></a><br>
<h2><font color="#3AC1EF">Что такое регулярные выражения</font></h2><br>
У многих, когда они впервые видят регулярные выражения, сразу же возникает мысль, что перед ними бессмысленное нагромождение символов. Но это, конечно, далеко не так. Взгляните, например, на это регулярное выражение<br>
<br>
<pre><code class="hljs tex">^([a-zA-Z0-9_<span class="hljs-tag">\<span class="hljs-name">-</span></span><span class="hljs-tag">\<span class="hljs-name">.</span></span><span class="hljs-tag">\<span class="hljs-name">+</span></span>]+)@([a-zA-Z0-9_<span class="hljs-tag">\<span class="hljs-name">-</span></span><span class="hljs-tag">\<span class="hljs-name">.</span></span>]+)<span class="hljs-tag">\<span class="hljs-name">.</span></span>([a-zA-Z]{2,5})<span class="hljs-formula">$</span></code></pre><br>
На наш взгляд даже абсолютный новичок сходу поймёт, как оно устроено и зачем нужно :) Если же вам не вполне понятно — просто читайте дальше и всё встанет на свои места.<br>
Регулярное выражение — это шаблон, пользуясь которым программы вроде sed или awk фильтруют тексты. В шаблонах используются обычные ASCII-символы, представляющие сами себя, и так называемые метасимволы, которые играют особую роль, например, позволяя ссылаться на некие группы символов.<br>
<br>
<h2><font color="#3AC1EF">Типы регулярных выражений</font></h2><br>
Реализации регулярных выражений в различных средах, например, в языках программирования вроде Java, Perl и Python, в инструментах Linux вроде sed, awk и grep, имеют определённые особенности. Эти особенности зависят от так называемых движков обработки регулярных выражений, которые занимаются интерпретацией шаблонов.<br>
В Linux имеется два движка регулярных выражений:<br>
<br>
<ul>
<li>Движок, поддерживающий стандарт POSIX Basic Regular Expression (BRE).</li>
<li>Движок, поддерживающий стандарт POSIX Extended Regular Expression (ERE).</li>
</ul><br>
Большинство утилит Linux соответствуют, как минимум, стандарту POSIX BRE, но некоторые утилиты (в их числе — sed) понимают лишь некое подмножество стандарта BRE. Одна из причин такого ограничения — стремление сделать такие утилиты как можно более быстрыми в деле обработки текстов.<br>
<br>
Стандарт POSIX ERE часто реализуют в языках программирования. Он позволяет пользоваться большим количеством средств при разработке регулярных выражений. Например, это могут быть специальные последовательности символов для часто используемых шаблонов, вроде поиска в тексте отдельных слов или наборов цифр. Awk поддерживает стандарт ERE.<br>
<br>
Существует много способов разработки регулярных выражений, зависящих и от мнения программиста, и от особенностей движка, под который их создают. Непросто писать универсальные регулярные выражения, которые сможет понять любой движок. Поэтому мы сосредоточимся на наиболее часто используемых регулярных выражениях и рассмотрим особенности их реализации для sed и awk.<br>
<br>
<h2><font color="#3AC1EF">Регулярные выражения POSIX BRE</font></h2><br>
Пожалуй, самый простой шаблон BRE представляет собой регулярное выражение для поиска точного вхождения последовательности символов в тексте. Вот как выглядит поиск строки в sed и awk:<br>
<br>
<pre><code class="hljs smalltalk"><span class="hljs-string">$ </span>echo <span class="hljs-comment">"This is a test"</span> | sed -n <span class="hljs-string">'/test/p'</span>
<span class="hljs-string">$ </span>echo <span class="hljs-comment">"This is a test"</span> | awk <span class="hljs-string">'/test/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/ce1/51e/066/ce151e066cd663f4df98e840831073ca.png"></div><br>
<i><font color="#999999">Поиск текста по шаблону в sed</font></i><br>
 <br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/9de/8f4/b47/9de8f4b471c6480e773c3de4301b5d0b.png"></div><br>
<i><font color="#999999">Поиск текста по шаблону в awk</font></i><br>
<br>
Можно заметить, что поиск заданного шаблона выполняется без учёта точного места нахождения текста в строке. Кроме того, не имеет значение и количество вхождений. После того, как регулярное выражение найдёт заданный текст в любом месте строки, строка считается подходящей и передаётся для дальнейшей обработки.<br>
<br>
Работая с регулярными выражениями нужно учитывать то, что они чувствительны к регистру символов:<br>
<br>
<pre><code class="hljs smalltalk"><span class="hljs-string">$ </span>echo <span class="hljs-comment">"This is a test"</span> | awk <span class="hljs-string">'/Test/{print $0}'</span>
<span class="hljs-string">$ </span>echo <span class="hljs-comment">"This is a test"</span> | awk <span class="hljs-string">'/test/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/a34/14c/d2c/a3414cd2cb6e497e44544ea3fa306f1f.png"></div><br>
<i><font color="#999999">Регулярные выражения чувствительны к регистру</font></i><br>
<br>
Первое регулярное выражение совпадений не нашло, так как слово «test», начинающееся с заглавной буквы, в тексте не встречается. Второе же, настроенное на поиск слова, написанного прописными буквами, обнаружило в потоке подходящую строку.<br>
<br>
В регулярных выражениях можно использовать не только буквы, но и пробелы, и цифры:<br>
<br>
<pre><code class="hljs smalltalk"><span class="hljs-string">$ </span>echo <span class="hljs-comment">"This is a test 2 again"</span> | awk <span class="hljs-string">'/test 2/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/aab/022/60a/aab02260a27124770cd425bd16c66a83.png"></div><br>
<i><font color="#999999">Поиск фрагмента текста, содержащего пробелы и цифры</font></i><br>
<br>
Пробелы воспринимаются движком регулярных выражений как обычные символы.<br>
<br>
<h2><font color="#3AC1EF">Специальные символы</font></h2><br>
При использовании различных символов в регулярных выражениях надо учитывать некоторые особенности. Так, существуют некоторые специальные символы, или метасимволы, использование которых в шаблоне требует особого подхода. Вот они:<br>
<br>
<pre><code class="hljs 1c">.*[]^${}\+?<span class="hljs-string">|()</span></code></pre><br>
Если один из них нужен в шаблоне, его нужно будет экранировать с помощью обратной косой черты (обратного слэша) — <code>\</code>.<br>
<br>
Например, если в тексте нужно найти знак доллара, его надо включить в шаблон, предварив символом экранирования. Скажем, имеется файл <code>myfile</code> с таким текстом:<br>
<br>
<pre><code class="hljs coffeescript">There <span class="hljs-keyword">is</span> <span class="hljs-number">10</span>$ <span class="hljs-literal">on</span> my pocket</code></pre><br>
Знак доллара можно обнаружить с помощью такого шаблона:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'/\$/{print <span class="hljs-subst">$0</span>}'</span> myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/2e2/056/628/2e2056628c28fd1d141bf3cc9d7253a7.png"></div><br>
<i><font color="#999999">Использование в шаблоне специального символа</font></i><br>
<br>
Кроме того, обратная косая черта — это тоже специальный символ, поэтому, если нужно использовать его в шаблоне, его тоже надо будет экранировать. Выглядит это как два слэша, идущих друг за другом:<br>
<br>
<pre><code class="hljs smalltalk"><span class="hljs-string">$ </span>echo <span class="hljs-comment">"\ is a special character"</span> | awk <span class="hljs-string">'/\\/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/47a/18f/06c/47a18f06c8a463f39d15da1f8bfd677a.png"></div><br>
<i><font color="#999999">Экранирование обратного слэша</font></i><br>
<br>
Хотя прямой слэш и не входит в приведённый выше список специальных символов, попытка воспользоваться им в регулярном выражении, написанном для sed или awk, приведёт к ошибке:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"3 / 2"</span> | awk <span class="hljs-string">'///{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/066/8a1/e77/0668a1e77511ed32970f60b26cd597e7.png"></div><br>
<i>Неправильное использование прямого слэша в шаблоне</i><br>
<br>
Если он нужен, его тоже надо экранировать:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"3 / 2"</span> | awk <span class="hljs-string">'/\//{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/13d/de2/d8a/13dde2d8afe39a863e124712188a95b2.png"></div><br>
<i><font color="#999999">Экранирование прямого слэша</font></i><br>
<br>
<h2><font color="#3AC1EF">Якорные символы</font></h2><br>
Существуют два специальных символа для привязки шаблона к началу или к концу текстовой строки. Символ «крышка» — <code>^</code> позволяет описывать последовательности символов, которые находятся в начале текстовых строк. Если искомый шаблон окажется в другом месте строки, регулярное выражение на него не отреагирует. Выглядит использование этого символа так:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"welcome to likegeeks website"</span> | awk <span class="hljs-string">'/^likegeeks/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"likegeeks website"</span> | awk <span class="hljs-string">'/^likegeeks/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/b64/da5/ad1/b64da5ad11297c7f97de46f83dcda1da.png"></div><br>
<i><font color="#999999">Поиск шаблона в начале строки</font></i><br>
<br>
Символ <code>^</code> предназначен для поиска шаблона в начале строки, при этом регистр символов так же учитывается. Посмотрим, как это отразится на обработке текстового файла:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'/^this/{print <span class="hljs-subst">$0</span>}'</span> myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/1fb/810/f9b/1fb810f9bb775d412ae5c3748e78e42c.png"></div><br>
<i><font color="#999999">Поиск шаблона в начале строки в тексте из файла</font></i><br>
<br>
При использовании sed, если поместить крышку где-нибудь внутри шаблона, она будет восприниматься как любой другой обычный символ:<br>
<br>
<pre><code class="hljs smalltalk"><span class="hljs-string">$ </span>echo <span class="hljs-comment">"This ^ is a test"</span> | sed -n <span class="hljs-string">'/s ^/p'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/6ee/eba/d80/6eeebad801eeb799f1208331658ee6ef.png"></div><br>
<i><font color="#999999">Крышка, находящаяся не в начале шаблона в sed</font></i><br>
<br>
В awk, при использовании такого же шаблона, данный символ надо экранировать:<br>
<br>
<pre><code class="hljs smalltalk"><span class="hljs-string">$ </span>echo <span class="hljs-comment">"This ^ is a test"</span> | awk <span class="hljs-string">'/s \^/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/fbb/a19/a69/fbba19a69e7814891f9d4c89e11c8414.png"></div><br>
<i><font color="#999999">Крышка, находящаяся не в начале шаблона в awk</font></i><br>
<br>
С поиском фрагментов текста, находящихся в начале строки мы разобрались. Что, если надо найти нечто, расположенное в конце строки?<br>
<br>
В этом нам поможет знак доллара — <code>$</code>, являющийся якорным символом конца строки:<br>
<br>
<pre><code class="hljs smalltalk"><span class="hljs-string">$ </span>echo <span class="hljs-comment">"This is a test"</span> | awk <span class="hljs-string">'/test$/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/b9a/040/0d5/b9a0400d5b963002ac59d3fc895f8f4f.png"></div><br>
<i><font color="#999999">Поиск текста, находящегося в конце строки</font></i><br>
<br>
В одном и том же шаблоне можно использовать оба якорных символа. Выполним обработку файла <code>myfile</code>, содержимое которого показано на рисунке ниже, с помощью такого регулярного выражения:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'/^this is a test$/{print <span class="hljs-subst">$0</span>}'</span> myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/d15/21b/87b/d1521b87b3ec1b32658b612b590c0f99.png"></div><br>
<i><font color="#999999">Шаблон, в котором использованы специальные символы начала и конца строки</font></i><br>
<br>
Как видно, шаблон среагировал лишь на строку, полностью соответствующую заданной последовательности символов и их расположению.<br>
<br>
Вот как, пользуясь якорными символами, отфильтровать пустые строки:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'!/^$/{print <span class="hljs-subst">$0</span>}'</span> myfile</code></pre><br>
В данном шаблоне использовал символ отрицания, восклицательный знак — <code>!</code>. Благодаря использованию такого шаблона выполняется поиск строк, не содержащих ничего между началом и концом строки, а благодаря восклицательному знаку на печать выводятся лишь строки, которые не соответствуют этому шаблону.<br>
<br>
<h2><font color="#3AC1EF">Символ «точка»</font></h2><br>
Точка используется для поиска любого одиночного символа, за исключением символа перевода строки. Передадим такому регулярному выражению файл <code>myfile</code>, содержимое которого приведено ниже:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'/.st/{print <span class="hljs-subst">$0</span>}'</span> myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/4a5/2d7/200/4a52d7200df95c30531ccc7a4a4924b1.png"></div><br>
<i><font color="#999999">Использование точки в регулярных выражениях</font></i><br>
<br>
Как видно по выведенным данным, шаблону соответствуют лишь первые две строки из файла, так как они содержат последовательность символов «st», предварённую ещё одним символом, в то время как третья строка подходящей последовательности не содержит, а в четвёртой она есть, но находится в самом начале строки.<br>
<br>
<h2><font color="#3AC1EF">Классы символов</font></h2><br>
Точка соответствует любому одиночному символу, но что если нужно более гибко ограничить набор искомых символов? В подобной ситуации можно воспользоваться классами символов.<br>
<br>
Благодаря такому подходу можно организовать поиск любого символа из заданного набора. Для описания класса символов используются квадратные скобки — <code>[]</code>:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'/[oi]th/{print <span class="hljs-subst">$0</span>}'</span> myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/f84/e0a/644/f84e0a6441893131f42b3892486d467d.png"></div><br>
<i><font color="#999999">Описание класса символов в регулярном выражении</font></i><br>
<br>
Тут мы ищем последовательность символов «th», перед которой есть символ «o» или символ «i».<br>
<br>
Классы оказываются очень кстати, если выполняется поиск слов, которые могут начинаться как с прописной, так и со строчной буквы:<br>
<br>
<pre><code class="hljs smalltalk"><span class="hljs-string">$ </span>echo <span class="hljs-comment">"this is a test"</span> | awk <span class="hljs-string">'/[Tt]his is a test/{print $0}'</span>
<span class="hljs-string">$ </span>echo <span class="hljs-comment">"This is a test"</span> | awk <span class="hljs-string">'/[Tt]his is a test/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/3d9/f65/8a2/3d9f658a231a01771a5fc209b1cd086a.png"></div><br>
<i><font color="#999999">Поиск слов, которые могут начинаться со строчной или прописной буквы</font></i><br>
<br>
Классы символов не ограничены буквами. Тут можно использовать и другие символы. Нельзя заранее сказать, в какой ситуации понадобятся классы — всё зависит от решаемой задачи.<br>
<br>
<h2><font color="#3AC1EF">Отрицание классов символов</font></h2><br>
Классы символов можно использовать и для решения задачи, обратной описанной выше. А именно, вместо поиска символов, входящих в класс, можно организовать поиск всего, что в класс не входит. Для того, чтобы добиться такого поведения регулярного выражения, перед списком символов класса нужно поместить знак <code>^</code>. Выглядит это так:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'/[^oi]th/{print <span class="hljs-subst">$0</span>}'</span> myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/ba4/ae6/853/ba4ae6853c092785c6c9db33bee0e9d8.png"></div><br>
<i><font color="#999999">Поиск символов, не входящих в класс</font></i><br>
<br>
В данном случае будут найдены последовательности символов «th», перед которыми нет ни «o», ни «i».<br>
<br>
<h2><font color="#3AC1EF">Диапазоны символов</font></h2><br>
В символьных классах можно описывать диапазоны символов, используя тире:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'/[e-p]st/{print <span class="hljs-subst">$0</span>}'</span> myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/646/f12/8aa/646f128aa44e661a023b6e721d81f020.png"></div><br>
<i><font color="#999999">Описание диапазона символов в символьном классе</font></i><br>
<br>
В данном примере регулярное выражение реагирует на последовательность символов «st», перед которой находится любой символ, расположенный, в алфавитном порядке, между символами «e» и «p».<br>
<br>
Диапазоны можно создавать и из чисел:<br>
<br>
<pre><code class="hljs markdown">$ echo "123" | awk '/[<span class="hljs-string">0-9</span>][<span class="hljs-symbol">0-9</span>][<span class="hljs-string">0-9</span>]/'
$ echo "12a" | awk '/[<span class="hljs-string">0-9</span>][<span class="hljs-symbol">0-9</span>][<span class="hljs-string">0-9</span>]/'</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/810/1e4/48b/8101e448b27a7c9cb9c56fc0434adc0a.png"></div><br>
<i><font color="#999999">Регулярное выражение для поиска трёх любых чисел</font></i><br>
<br>
В класс символов могут входить несколько диапазонов:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'/[a-fm-z]st/{print <span class="hljs-subst">$0</span>}'</span> myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/7e9/999/623/7e99996235e70b1dc907315343ae9b01.png"></div><br>
<i><font color="#999999">Класс символов, состоящий из нескольких диапазонов</font></i><br>
<br>
Данное регулярное выражение найдёт все последовательности «st», перед которыми есть символы из диапазонов <code>a-f</code> и <code>m-z</code>.<br>
<br>
<h2><font color="#3AC1EF">Специальные классы символов</font></h2><br>
В BRE имеются специальные классы символов, которые можно использовать при написании регулярных выражений:<br>
<br>
<ul>
<li><code>[[:alpha:]]</code> — соответствует любому алфавитному символу, записанному в верхнем или нижнем регистре.</li>
<li><code>[[:alnum:]]</code> — соответствует любому алфавитно-цифровому символу, а именно — символам в диапазонах <code>0-9</code>, <code>A-Z</code>, <code>a-z</code>.</li>
<li><code>[[:blank:]]</code> — соответствует пробелу и знаку табуляции.</li>
<li><code>[[:digit:]]</code> — любой цифровой символ от <code>0</code> до <code>9</code>.</li>
<li><code>[[:upper:]]</code> — алфавитные символы в верхнем регистре — <code>A-Z</code>.</li>
<li><code>[[:lower:]]</code> — алфавитные символы в нижнем регистре — <code>a-z</code>.<br>
</li>
<li><code>[[:print:]]</code> — соответствует любому печатаемому символу.</li>
<li><code>[[:punct:]]</code> — соответствует знакам препинания.</li>
<li><code>[[:space:]]</code> — пробельные символы, в частности — пробел, знак табуляции, символы <code>NL</code>, <code>FF</code>, <code>VT</code>, <code>CR</code>.</li>
</ul><br>
Использовать специальные классы в шаблонах можно так:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"abc"</span> | awk <span class="hljs-string">'/[[:alpha:]]/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"abc"</span> | awk <span class="hljs-string">'/[[:digit:]]/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"abc123"</span> | awk <span class="hljs-string">'/[[:digit:]]/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/4e2/386/e8b/4e2386e8bce40ead25463d12945199f0.png"></div><br>
<i><font color="#999999">Специальные классы символов в регулярных выражениях</font></i><br>
 <br>
<h2><font color="#3AC1EF">Символ «звёздочка»</font></h2><br>
Если в шаблоне после символа поместить звёздочку, это будет означать, что регулярное выражение сработает, если символ появляется в строке любое количество раз — включая и ситуацию, когда символ в строке отсутствует.<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"test"</span> | awk <span class="hljs-string">'/tes*t/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"tessst"</span> | awk <span class="hljs-string">'/tes*t/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/0f7/04b/9ad/0f704b9ad0e6db2349a5257a35a42b8f.png"></div><br>
<i><font color="#999999">Использование символа * в регулярных выражениях</font></i><br>
<br>
Этот шаблонный символ обычно используют для работы со словами, в которых постоянно встречаются опечатки, или для слов, допускающих разные варианты корректного написания:<br>
<br>
<pre><code class="hljs smalltalk"><span class="hljs-string">$ </span>echo <span class="hljs-comment">"I like green color"</span> | awk <span class="hljs-string">'/colou*r/{print $0}'</span>
<span class="hljs-string">$ </span>echo <span class="hljs-comment">"I like green colour "</span> | awk <span class="hljs-string">'/colou*r/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/fb8/bbd/4a6/fb8bbd4a6cda3194f5438e44ec0d19a2.png"></div><br>
<i><font color="#999999">Поиск слова, имеющего разные варианты написания</font></i><br>
<br>
В этом примере одно и то же регулярное выражение реагирует и на слово «color», и на слово «colour». Это так благодаря тому, что символ «u», после которого стоит звёздочка, может либо отсутствовать, либо встречаться несколько раз подряд.<br>
<br>
Ещё одна полезная возможность, вытекающая из особенностей символа звёздочки, заключается в комбинировании его с точкой. Такая комбинация позволяет регулярному выражению реагировать на любое количество любых символов:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'/this.*test/{print <span class="hljs-subst">$0</span>}'</span> myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/078/f43/49a/078f4349a99b37584cfc11404d373178.png"></div><br>
<i><font color="#999999">Шаблон, реагирующий на любое количество любых символов</font></i><br>
<br>
В данном случае неважно сколько и каких символов находится между словами «this» и «test».<br>
<br>
Звёздочку можно использовать и с классами символов:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"st"</span> | awk <span class="hljs-string">'/s[ae]*t/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"sat"</span> | awk <span class="hljs-string">'/s[ae]*t/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"set"</span> | awk <span class="hljs-string">'/s[ae]*t/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/0b4/3c8/413/0b43c8413d2fd63352a82d6cb3a1909e.png"></div><br>
<i><font color="#999999">Использование звёздочки с классами символов</font></i><br>
<br>
Во всех трёх примерах регулярное выражение срабатывает, так как звёздочка после класса символов означает, что если будет найдено любое количество символов «a» или «e», а также если их найти не удастся, строка будет соответствовать заданному шаблону.<br>
<br>
<h2><font color="#3AC1EF">Регулярные выражения POSIX ERE</font></h2><br>
Шаблоны стандарта POSIX ERE, которые поддерживают некоторые утилиты Linux, могут содержать дополнительные символы. Как уже было сказано, awk поддерживает этот стандарт, а вот sed — нет.<br>
<br>
Тут мы рассмотрим наиболее часто используемые в ERE-шаблонах символы, которые пригодятся вам при создании собственных регулярных выражений.<br>
<br>
<h3><font color="#3AC1EF">▍Вопросительный знак</font></h3><br>
Вопросительный знак указывает на то, что предшествующий символ может встретиться в тексте один раз или не встретиться вовсе. Этот символ — один из метасимволов повторений. Вот несколько примеров:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"tet"</span> | awk <span class="hljs-string">'/tes?t/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"test"</span> | awk <span class="hljs-string">'/tes?t/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"tesst"</span> | awk <span class="hljs-string">'/tes?t/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/9e6/6ae/758/9e66ae7580f900e395dd762497f36a39.png"></div><br>
<i><font color="#999999">Вопросительный знак в регулярных выражениях</font></i><br>
<br>
Как видно, в третьем случае буква «s» встречается дважды, поэтому на слово «tesst» регулярное выражение не реагирует.<br>
<br>
Вопросительный знак можно использовать и с классами символов:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"tst"</span> | awk <span class="hljs-string">'/t[ae]?st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"test"</span> | awk <span class="hljs-string">'/t[ae]?st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"tast"</span> | awk <span class="hljs-string">'/t[ae]?st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"taest"</span> | awk <span class="hljs-string">'/t[ae]?st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"teest"</span> | awk <span class="hljs-string">'/t[ae]?st/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/be8/fe3/1e3/be8fe31e3f05cf44b2176c9e300bbc74.png"></div><br>
<i><font color="#999999">Вопросительный знак и классы символов</font></i><br>
<br>
Если символов из класса в строке нет, или один из них встречается один раз, регулярное выражение срабатывает, однако стоит в слове появиться двум символам и система уже не находит в тексте соответствия шаблону.<br>
<br>
<h3><font color="#3AC1EF">▍Символ «плюс»</font></h3><br>
Символ «плюс» в шаблоне указывает на то, что регулярное выражение обнаружит искомое в том случае, если предшествующий символ встретится в тексте один или более раз. При этом на отсутствие символа такая конструкция реагировать не будет:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"test"</span> | awk <span class="hljs-string">'/te+st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"teest"</span> | awk <span class="hljs-string">'/te+st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"tst"</span> | awk <span class="hljs-string">'/te+st/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/d64/5c9/a06/d645c9a064e8c4af30d83ee3a21c6f56.png"></div><br>
<i><font color="#999999">Символ «плюс» в регулярных выражениях</font></i><br>
<br>
В данном примере, если символа «e» в слове нет, движок регулярных выражений не найдёт в тексте соответствий шаблону. Символ «плюс» работает и с классами символов — этим он похож на звёздочку и вопросительный знак:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"tst"</span> | awk <span class="hljs-string">'/t[ae]+st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"test"</span> | awk <span class="hljs-string">'/t[ae]+st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"teast"</span> | awk <span class="hljs-string">'/t[ae]+st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"teeast"</span> | awk <span class="hljs-string">'/t[ae]+st/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/c77/6a7/78e/c776a778eabbfcf0dd0a77f98c26175c.png"></div><br>
<i><font color="#999999">Знак «плюс» и классы символов</font></i><br>
<br>
В данном случае если в строке имеется любой символ из класса, текст будет сочтён соответствующим шаблону.<br>
<br>
<h3><font color="#3AC1EF">▍Фигурные скобки</font></h3><br>
Фигурные скобки, которыми можно пользоваться в ERE-шаблонах, похожи на символы, рассмотренные выше, но они позволяют точнее задавать необходимое число вхождений предшествующего им символа. Указывать ограничение можно в двух форматах:<br>
<br>
<ul>
<li><code>n — </code>число, задающее точное число искомых вхождений<br>
</li>
<li><code>n, m — </code>два числа, которые трактуются так: «как минимум n раз, но не больше чем m».<br>
</li>
</ul><br>
Вот примеры первого варианта:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"tst"</span> | awk <span class="hljs-string">'/te{1}st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"test"</span> | awk <span class="hljs-string">'/te{1}st/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/4ac/c40/2e5/4acc402e59676f3630b5b73d12ff7cfa.png"></div><br>
<i><font color="#999999">Фигурные скобки в шаблонах, поиск точного числа вхождений</font></i><br>
<br>
В старых версиях awk нужно было использовать ключ командной строки <code>--re-interval</code> для того, чтобы программа распознавала интервалы в регулярных выражениях, но в новых версиях этого делать не нужно.<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"tst"</span> | awk <span class="hljs-string">'/te{1,2}st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"test"</span> | awk <span class="hljs-string">'/te{1,2}st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"teest"</span> | awk <span class="hljs-string">'/te{1,2}st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"teeest"</span> | awk <span class="hljs-string">'/te{1,2}st/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/7ba/0c0/3f5/7ba0c03f5020b615812530ca2af99b13.png"></div><br>
<i><font color="#999999">Интервал, заданный в фигурных скобках</font></i><br>
<br>
В данном примере символ «e» должен встретиться в строке 1 или 2 раза, тогда регулярное выражение отреагирует на текст.<br>
<br>
Фигурные скобки можно применять и с классами символов. Тут действуют уже знакомые вам принципы:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"tst"</span> | awk &nbsp;<span class="hljs-string">'/t[ae]{1,2}st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"test"</span> | awk &nbsp;<span class="hljs-string">'/t[ae]{1,2}st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"teest"</span> | awk &nbsp;<span class="hljs-string">'/t[ae]{1,2}st/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"teeast"</span> | awk &nbsp;<span class="hljs-string">'/t[ae]{1,2}st/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/88e/e97/03a/88ee9703a9d01a0200e19f6bef7096b3.png"></div><br>
<i><font color="#999999">Фигурные скобки и классы символов</font></i><br>
<br>
Шаблон отреагирует на текст в том случае, если в нём один или два раза встретится символ «a» или символ «e».<br>
<br>
<h3><font color="#3AC1EF">▍Символ логического «или»</font></h3><br>
Символ <code>|</code> — вертикальная черта, означает в регулярных выражениях логическое «или». Обрабатывая регулярное выражение, содержащее несколько фрагментов, разделённых таким знаком, движок сочтёт анализируемый текст подходящим в том случае, если он будет соответствовать любому из фрагментов. Вот пример:<br>
<br>
<pre><code class="hljs smalltalk"><span class="hljs-string">$ </span>echo <span class="hljs-comment">"This is a test"</span> | awk <span class="hljs-string">'/test|exam/{print $0}'</span>
<span class="hljs-string">$ </span>echo <span class="hljs-comment">"This is an exam"</span> | awk <span class="hljs-string">'/test|exam/{print $0}'</span>
<span class="hljs-string">$ </span>echo <span class="hljs-comment">"This is something else"</span> | awk <span class="hljs-string">'/test|exam/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/3b5/5b7/4f1/3b55b74f1cf11a6aafdbd4839413d31c.png"></div><br>
<i><font color="#999999">Логическое «или» в регулярных выражениях</font></i><br>
<br>
В данном примере регулярное выражение настроено на поиск в тексте слов «test» или «exam». Обратите внимание на то, что между фрагментами шаблона и разделяющим их символом <code>|</code> не должно быть пробелов.<br>
<br>
<h2><font color="#3AC1EF">Группировка фрагментов регулярных выражений</font></h2><br>
Фрагменты регулярных выражений можно группировать, пользуясь круглыми скобками. Если сгруппировать некую последовательность символов, она будет восприниматься системой как обычный символ. То есть, например, к ней можно будет применить метасимволы повторений. Вот как это выглядит:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"Like"</span> | awk <span class="hljs-string">'/Like(Geeks)?/{print $0}'</span>
$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"LikeGeeks"</span> | awk <span class="hljs-string">'/Like(Geeks)?/{print $0}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/c78/c80/df7/c78c80df73aa2c9817f53df90a067ad8.png"></div><br>
<i><font color="#999999">Группировка фрагментов регулярных выражений</font></i><br>
<br>
В данных примерах слово «Geeks» заключено в круглые скобки, после этой конструкции идёт знак вопроса. Напомним, что вопросительный знак означает «0 или 1 повторение», в результате регулярное выражение отреагирует и на строку «Like», и на строку «LikeGeeks».<br>
<br>
<h2><font color="#3AC1EF">Практические примеры</font></h2><br>
После того, как мы разобрали основы регулярных выражений, пришло время сделать с их помощью что-нибудь полезное.<br>
<br>
<h3><font color="#3AC1EF">▍Подсчёт количества файлов</font></h3><br>
Напишем bash-скрипт, который подсчитывает файлы, находящиеся в директориях, которые записаны в переменную окружения <code>PATH</code>. Для того, чтобы это сделать, понадобится, для начала, сформировать список путей к директориям. Сделаем это с помощью sed, заменив двоеточия на пробелы:<br>
<br>
<pre><code class="hljs bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-variable">$PATH</span> | sed <span class="hljs-string">'s/:/ /g'</span></code></pre><br>
Команда замены поддерживает регулярные выражения в качестве шаблонов для поиска текста. В данном случае всё предельно просто, ищем мы символ двоеточия, но никто не мешает использовать здесь и что-нибудь другое — всё зависит от конкретной задачи.<br>
Теперь надо пройтись по полученному списку в цикле и выполнить там необходимые для подсчёта количества файлов действия. Общая схема скрипта будет такой:<br>
<br>
<pre><code class="hljs bash">mypath=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$PATH</span> | sed <span class="hljs-string">'s/:/ /g'</span>)
<span class="hljs-keyword">for</span> directory <span class="hljs-keyword">in</span> <span class="hljs-variable">$mypath</span>
 
<span class="hljs-keyword">do</span>
 
<span class="hljs-keyword">done</span></code></pre><br>
Теперь напишем полный текст скрипта, воспользовавшись командой <code>ls</code> для получения сведений о количестве файлов в каждой из директорий:<br>
<br>
<pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span>
mypath=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$PATH</span> | sed <span class="hljs-string">'s/:/ /g'</span>)
count=0
<span class="hljs-keyword">for</span> directory <span class="hljs-keyword">in</span> <span class="hljs-variable">$mypath</span>
<span class="hljs-keyword">do</span>
check=$(ls <span class="hljs-variable">$directory</span>)
<span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> <span class="hljs-variable">$check</span>
<span class="hljs-keyword">do</span>
count=$[ <span class="hljs-variable">$count</span> + 1 ]
<span class="hljs-keyword">done</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$directory</span> - <span class="hljs-variable">$count</span>"</span>
count=0
<span class="hljs-keyword">done</span></code></pre><br>
При запуске скрипта может оказаться, что некоторых директорий из <code>PATH</code> не существует, однако, это не помешает ему посчитать файлы в существующих директориях.<br>
<br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/75b/6ef/697/75b6ef697cb8244cb70599f42d80c663.png"></div><br>
<i><font color="#999999">Подсчёт файлов</font></i><br>
<br>
Главная ценность этого примера заключается в том, что пользуясь тем же подходом, можно решать и куда более сложные задачи. Какие именно — зависит от ваших потребностей.<br>
<br>
<h3><font color="#3AC1EF">▍Проверка адресов электронной почты</font></h3><br>
Существуют веб-сайты с огромными коллекциями регулярных выражений, которые позволяют проверять адреса электронной почты, телефонные номера, и так далее. Однако, одно дело — взять готовое, и совсем другое — создать что-то самому. Поэтому напишем регулярное выражение для проверки адресов электронной почты. Начнём с анализа исходных данных. Вот, например, некий адрес:<br>
<br>
<pre><code class="hljs coffeescript">username@hostname.com</code></pre><br>
Имя пользователя, <code>username</code>, может состоять из алфавитно-цифровых и некоторых других символов. А именно, это точка, тире, символ подчёркивания, знак «плюс». За именем пользователя следует знак @.<br>
<br>
Вооружившись этими знаниями, начнём сборку регулярного выражения с его левой части, которая служит для проверки имени пользователя. Вот что у нас получилось:<br>
<br>
<pre><code class="hljs tex">^([a-zA-Z0-9_<span class="hljs-tag">\<span class="hljs-name">-</span></span><span class="hljs-tag">\<span class="hljs-name">.</span></span><span class="hljs-tag">\<span class="hljs-name">+</span></span>]+)@</code></pre><br>
Это регулярное выражение можно прочитать так: «В начале строки должен быть как минимум один символ из тех, которые имеются в группе, заданной в квадратных скобках, а после этого должен идти знак @».<br>
<br>
Теперь — очередь имени хоста — <code>hostname</code>. Тут применимы те же правила, что и для имени пользователя, поэтому шаблон для него будет выглядеть так:<br>
<br>
<pre><code class="hljs tex">([a-zA-Z0-9_<span class="hljs-tag">\<span class="hljs-name">-</span></span><span class="hljs-tag">\<span class="hljs-name">.</span></span>]+)</code></pre><br>
Имя домена верхнего уровня подчиняется особым правилам. Тут могут быть лишь алфавитные символы, которых должно быть не меньше двух (например, такие домены обычно содержат код страны), и не больше пяти. Всё это значит, что шаблон для проверки последней части адреса будет таким:<br>
<br>
<pre><code class="hljs powershell">\.([<span class="hljs-type">a</span>-<span class="hljs-type">zA</span>-<span class="hljs-type">Z</span>]{<span class="hljs-number">2</span>,<span class="hljs-number">5</span>})<span class="hljs-variable">$</span></code></pre><br>
Прочесть его можно так: «Сначала должна быть точка, потом — от 2 до 5 алфавитных символов, а после этого строка заканчивается».<br>
<br>
Подготовив шаблоны для отдельных частей регулярного выражения, соберём их вместе:<br>
<br>
<pre><code class="hljs tex">^([a-zA-Z0-9_<span class="hljs-tag">\<span class="hljs-name">-</span></span><span class="hljs-tag">\<span class="hljs-name">.</span></span><span class="hljs-tag">\<span class="hljs-name">+</span></span>]+)@([a-zA-Z0-9_<span class="hljs-tag">\<span class="hljs-name">-</span></span><span class="hljs-tag">\<span class="hljs-name">.</span></span>]+)<span class="hljs-tag">\<span class="hljs-name">.</span></span>([a-zA-Z]{2,5})<span class="hljs-formula">$</span></code></pre><br>
Теперь осталось лишь протестировать то, что получилось:<br>
<br>
<pre><code class="hljs tex"><span class="hljs-formula">$ echo "name@host.com" | awk '/^([a-zA-Z0-9_<span class="hljs-tag">\<span class="hljs-name">-</span></span><span class="hljs-tag">\<span class="hljs-name">.</span></span><span class="hljs-tag">\<span class="hljs-name">+</span></span>]+)@([a-zA-Z0-9_<span class="hljs-tag">\<span class="hljs-name">-</span></span><span class="hljs-tag">\<span class="hljs-name">.</span></span>]+)<span class="hljs-tag">\<span class="hljs-name">.</span></span>([a-zA-Z]{2,5})$</span>/{print <span class="hljs-formula">$0}'
$</span> echo "name@host.com.us" | awk '/^([a-zA-Z0-9_<span class="hljs-tag">\<span class="hljs-name">-</span></span><span class="hljs-tag">\<span class="hljs-name">.</span></span><span class="hljs-tag">\<span class="hljs-name">+</span></span>]+)@([a-zA-Z0-9_<span class="hljs-tag">\<span class="hljs-name">-</span></span><span class="hljs-tag">\<span class="hljs-name">.</span></span>]+)<span class="hljs-tag">\<span class="hljs-name">.</span></span>([a-zA-Z]{2,5})<span class="hljs-formula">$/{print $</span>0}'</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/9a5/f01/a60/9a5f01a6058b364523a8241e5f35c344.png"></div><br>
<i><font color="#999999">Проверка адреса электронной почты с помощью регулярных выражений</font></i><br>
<br>
То, что переданный awk текст выводится на экран, означает, что система распознала в нём адрес электронной почты.<br>
<br>
<h2><font color="#3AC1EF">Итоги</font></h2><br>
Если регулярное выражение для проверки адресов электронной почты, которое встретилось вам в самом начале статьи, казалось тогда совершенно непонятным, надеемся, сейчас оно уже не выглядит бессмысленным набором символов. Если это действительно так — значит данный материал выполнил своё предназначение. На самом деле, регулярные выражения — это тема, которой можно заниматься всю жизнь, но даже то немногое, что мы разобрали, уже способно помочь вам в написании скриптов, которые довольно продвинуто обрабатывают тексты.<br>
<br>
В этой серии материалов мы обычно показывали очень простые примеры bash-скриптов, которые состояли буквально из нескольких строк. В следующий раз рассмотрим кое-что более масштабное.<br>
<br>
Уважаемые читатели! А вы пользуетесь регулярными выражениями при обработке текстов в сценариях командной строки?<br>
<br>
<a href="https://ruvds.com/ru-rub/#order"><img src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/files/1ba/550/d25/1ba550d25e8846ce8805de564da6aa63.png"></a></div></div><div aria-hidden="true" role="dialog" tabindex="-1" class="pswp"><div class="pswp__bg"></div><div class="pswp__scroll-wrap"><div class="pswp__container"><div class="pswp__item"></div><div class="pswp__item"></div><div class="pswp__item"></div></div><div class="pswp__ui pswp__ui--hidden"><div class="pswp__top-bar"><span class="tm-svg-icon__wrapper pswp__button pswp__button--close"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Закрыть</title><use xlink:href="/img/megazord-v24.cee85629.svg#close"></use></svg></span><div class="pswp__preloader"><div class="pswp__preloader__icn"><div class="pswp__preloader__cut"><div class="pswp__preloader__donut"></div></div></div></div></div></div></div></div><!----></div><div class="tm-article-body__tags"><div class="tm-article-body__tags-links"><span class="tm-article-body__tags-title">Теги:</span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5BRuVDS%5D" class="tm-article-body__tags-item-link">RuVDS</a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5BLinux%5D" class="tm-article-body__tags-item-link">Linux</a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5BBash%5D" class="tm-article-body__tags-item-link">Bash</a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5B%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B9%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%5D" class="tm-article-body__tags-item-link">сценарий командной строки</a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5BBash-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%5D" class="tm-article-body__tags-item-link">Bash-скрипт</a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5B%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5%20%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%5D" class="tm-article-body__tags-item-link">регулярные выражения</a></span></div><div class="tm-article-body__tags-links"><span class="tm-article-body__tags-title">Хабы:</span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/company/ruvds/blog/" class="tm-article-body__tags-item-link router-link-active">
                  Блог компании RUVDS.com
                </a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/hub/linux/" class="tm-article-body__tags-item-link">
                  Настройка Linux
                </a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/hub/sys_admin/" class="tm-article-body__tags-item-link">
                  Системное администрирование
                </a></span></div></div></article><div class="tm-article__icons-wrapper"><div class="tm-data-icons tm-page-article__counters-panel"><div class="tm-article-rating tm-data-icons__item"><div class="tm-votes-meter tm-article-rating__votes-switcher"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_medium"><title>Всего голосов 27: ↑24 и ↓3</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 27: ↑24 и ↓3" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_medium">+21</span></div><div class="v-portal" style="display: none;"></div></div><!----><!----><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    337
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/327896/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      45
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/327896/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +45
    </span></a></div><div class="tm-sharing tm-data-icons__item" title="Поделиться"><button type="button" class="tm-sharing__button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="tm-sharing__icon"><path fill="currentColor" d="M10.33.275l9.047 7.572a.2.2 0 010 .306l-9.048 7.572a.2.2 0 01-.328-.153V11c-8 0-9.94 6-9.94 6S-1 5 10 5V.428a.2.2 0 01.328-.153z"></path></svg></button><!----></div><div class="v-portal" style="display: none;"></div></div></div><!----></div><!----><div class="tm-page-article__additional-blocks"><div class="tm-editoral-subscription"><span class="tm-svg-icon__wrapper tm-editoral-subscription__close"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Закрыть</title><use xlink:href="/img/megazord-v24.cee85629.svg#close"></use></svg></span><h3 class="tm-editoral-subscription__title">
    Редакторский дайджест
  </h3><p class="tm-editoral-subscription__description">
    Присылаем лучшие статьи раз&nbsp;в&nbsp;месяц
  </p><form method="GET" class="tm-editoral-subscription__form"><div class="tm-input-text-decorated tm-editoral-subscription__input tm-input-text-decorated_has-label-after" name="email" placeholder="Электропочта" type="email"><!----><input name="email" placeholder="Электропочта" type="email" class="tm-input-text-decorated__input"><div class="tm-input-text-decorated__label tm-input-text-decorated__label_after"><button type="submit" class="tm-editoral-subscription__icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class=""><path fill="currentColor" clip-rule="evenodd" d="M19.707 11.293a1 1 0 010 1.414l-5.5 5.5a1 1 0 01-1.414-1.414L16.586 13H5a1 1 0 110-2h11.586l-3.793-3.793a1 1 0 011.414-1.414l5.5 5.5z"></path></svg></button></div></div><!----></form></div><section class="tm-block tm-block_spacing-bottom"><!----><div class="tm-block__body"><div class="tm-article-author tm-page-article__author"><div class="tm-article-author__company"><div class="tm-article-author__company-card"><div class="tm-company-snippet"><a href="https://habr.com/ru/company/ruvds/profile/" class="tm-company-snippet__logo-link"><div class="tm-entity-image"><img alt="" height="40" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/f27ea85bd62fbd985c308110885af7e0.png" width="40" class="tm-entity-image__pic"></div></a><div class="tm-company-snippet__info"><a href="https://habr.com/ru/company/ruvds/profile/" class="tm-company-snippet__title">RUVDS.com</a><div class="tm-company-snippet__description">VDS/VPS-хостинг. Скидка 10% по коду <b>HABR10</b></div></div></div><div class="tm-article-author__buttons"><!----><!----></div></div><div class="tm-article-author__company-contacts"><a href="https://facebook.com/ruvds" rel="noopener" target="_blank" class="tm-article-author__contact">
        Facebook
      </a><a href="https://twitter.com/ru_vds" rel="noopener" target="_blank" class="tm-article-author__contact">
        Twitter
      </a><a href="https://vk.com/ru_vds" rel="noopener" target="_blank" class="tm-article-author__contact">
        ВКонтакте
      </a></div><div class="tm-article-author__separator"></div></div><div class="tm-user-card tm-article-author__user-card tm-user-card_variant-two-column"><div class="tm-user-card__info-container"><div class="tm-user-card__header"><div class="tm-user-card__header-data"><a href="https://habr.com/ru/users/ru_vds/" class="tm-user-card__userpic tm-user-card__userpic_size-40"><div class="tm-entity-image"><img alt="" src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/e36812d3de38eb3d479d7a13228717ef(1).png" class="tm-entity-image__pic"></div></a><div class="tm-user-card__meta"><div title=" 943 голоса " class="tm-karma tm-user-card__karma"><div class="tm-karma__votes tm-karma__votes_positive">
    204.5
  </div><div class="tm-karma__text">
    Карма
  </div></div><div class="tm-rating tm-user-card__rating" title="Рейтинг пользователя"><div class="tm-rating__header"><div class="tm-rating__counter">110</div></div><div class="tm-rating__text">
    Рейтинг
  </div></div></div></div></div><div class="tm-user-card__info"><div class="tm-user-card__title"><!----><a href="https://habr.com/ru/users/ru_vds/" class="tm-user-card__nickname">
          @ru_vds
        </a><!----></div><p class="tm-user-card__short-info">Пользователь</p></div></div><div class="tm-user-card__buttons tm-user-card__buttons_variant-two-column"><!----><!----><!----><!----><!----></div></div><!----></div></div><!----></section><div class="tm-page-article__comments"><div class="tm-article-page-comments"><div class="tm-article-comments-counter-link tm-article-comments-counter-button"><a href="https://habr.com/ru/company/ruvds/blog/327896/comments/" class="tm-article-comments-counter-link__link tm-article-comments-counter-link__link_button-style"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon tm-article-comments-counter-link__icon_contrasted"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value tm-article-comments-counter-link__value_contrasted">
       Комментарии 45 
    </span></a><!----></div></div></div><!----><section class="tm-block tm-block_spacing-around"><header class="tm-block__header"><h2 class="tm-block__title">Похожие публикации</h2><!----></header><div class="tm-block__body"><ul class="tm-article-list-block__list"><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2020-12-18T09:10:01.000Z" title="2020-12-18, 16:10">18  декабря  2020 в 16:10</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ruvds/blog/533334/" class="tm-article-title__link"><span>Кунг-фу стиля Linux: регулярные выражения</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 39: ↑36 и ↓3</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 39: ↑36 и ↓3" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+33</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">13K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    156
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/533334/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      6
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/533334/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +6
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2020-12-09T09:47:23.000Z" title="2020-12-09, 16:47">9  декабря  2020 в 16:47</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ruvds/blog/529840/" class="tm-article-title__link"><span>Кунг-фу стиля Linux: утилита marker и меню для командной строки</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 29: ↑28 и ↓1</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 29: ↑28 и ↓1" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+27</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">6.4K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    64
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/529840/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      4
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/529840/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +4
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2017-12-04T09:01:01.000Z" title="2017-12-04, 16:01">4  декабря  2017 в 16:01</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ruvds/blog/343798/" class="tm-article-title__link"><span>Основы регулярных выражений в JavaScript</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 24: ↑23 и ↓1</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 24: ↑23 и ↓1" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+22</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">29K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    269
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/343798/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      20
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/343798/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +20
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><!----></ul></div><!----></section><!----><section class="tm-block tm-block_spacing-around"><header class="tm-block__header"><h2 class="tm-block__title">Лучшие публикации за сутки</h2><!----></header><div class="tm-block__body"><ul class="tm-article-list-block__list"><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2021-08-26T09:00:02.000Z" title="2021-08-26, 16:00">вчера в 16:00</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ruvds/blog/574742/" class="tm-article-title__link"><span>Сетевые соединения X11</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 48: ↑46 и ↓2</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 48: ↑46 и ↓2" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+44</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">5.3K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    46
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/574742/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      9
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/574742/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +9
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2021-08-26T13:00:01.000Z" title="2021-08-26, 20:00">вчера в 20:00</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ruvds/blog/574352/" class="tm-article-title__link"><span>Осваиваем LaTeX за 30 минут</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 47: ↑43 и ↓4</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 47: ↑43 и ↓4" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+39</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">5K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    117
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/574352/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      27
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/574352/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +27
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2021-08-26T21:08:54.000Z" title="2021-08-27, 04:08">сегодня в 04:08</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/post/571514/" class="tm-article-title__link"><span>Самогонный аппарат — полный автомат. Часть 3. Заключительная</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 38: ↑37 и ↓1</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 38: ↑37 и ↓1" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+36</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">6.9K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    50
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/post/571514/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      7
    </span></a><a href="https://habr.com/ru/post/571514/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +7
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2021-08-26T17:24:20.000Z" title="2021-08-27, 00:24">сегодня в 00:24</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/kaspersky/blog/574884/" class="tm-article-title__link"><span>Sony Playstation Portable, радость коллекционера</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 33: ↑31 и ↓2</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 33: ↑31 и ↓2" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+29</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">6.5K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    15
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/kaspersky/blog/574884/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      15
    </span></a><a href="https://habr.com/ru/company/kaspersky/blog/574884/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +15
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2021-08-26T11:06:06.000Z" title="2021-08-26, 18:06">вчера в 18:06</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ods/blog/572264/" class="tm-article-title__link"><span>Анализ вакансий и зарплат в Data Science</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 30: ↑29 и ↓1</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 30: ↑29 и ↓1" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+28</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">7.8K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    31
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ods/blog/572264/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      11
    </span></a><a href="https://habr.com/ru/company/ods/blog/572264/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +11
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><!----></ul></div><!----></section><!----><!----></div></div></div><div class="tm-page__sidebar"><!----></div></div></div></div></main><!----></div><!----><div class="tm-footer"><div class="tm-page-width"><div class="tm-footer__container"><div class="tm-footer__title"><a href="https://habr.com/ru/" class="tm-svg-icon__wrapper tm-footer__title-link router-link-active"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Хабр</title><use xlink:href="/img/habr-logo-ru.svg#logo"></use></svg></a></div><div class="tm-footer__social"><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://www.facebook.com/habrahabr.ru" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Facebook</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-facebook"></use></svg></a><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://twitter.com/habr_com" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Twitter</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-twitter"></use></svg></a><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://vk.com/habr" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>VK</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-vkontakte"></use></svg></a><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://telegram.me/habr_com" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Telegram</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-telegram"></use></svg></a><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://www.youtube.com/channel/UCd_sTwKqVrweTt4oAKY5y4w" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Youtube</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-youtube"></use></svg></a><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://zen.yandex.ru/habr" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Яндекс Дзен</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-zen"></use></svg></a></div><div class="v-portal" style="display: none;"></div><button class="tm-footer__link"><svg height="16" width="16" class="tm-svg-img tm-footer__icon"><title>Язык</title><use xlink:href="/img/megazord-v24.cee85629.svg#lang"></use></svg>
        Настройка языка
      </button><a href="https://habr.com/ru/about" class="tm-footer__link">
        О сайте
      </a><a href="https://habr.com/ru/feedback/" class="tm-footer__link">
        Техническая поддержка
      </a><a href="https://habr.com/ru/company/ruvds/blog/327896/?mobile=no" class="tm-footer__link">
        Полная версия
      </a><a href="https://habr.com/berserk-mode-nope" class="tm-footer__link">
        Вернуться на старую версию
      </a><div class="tm-footer-copyright"><span class="tm-copyright"><span class="tm-copyright__years">© 2006–2021 </span><span class="tm-copyright__name">«<a href="https://company.habr.com/" rel="noopener" target="_blank" class="tm-copyright__link">Habr</a>»</span></span></div></div></div></div><!----><!----></div><div class="vue-portal-target"><!----></div></div>

<script src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/chunk-vendors.1ca41abb.js" defer=""></script><script src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/about.2d3fd602.js" defer=""></script><script src="./Bash-скрипты, часть 9_ регулярные выражения _ Блог компании RUVDS.com _ Хабр_files/app.132461d8.js" defer=""></script>



    <script>
      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
    </script>
  
  <script type="text/javascript">
    (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
    m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
    (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");

    ym(24049213, "init", {
      defer:true,
      trackLinks:true,
      accurateTrackBounce:true,
      webvisor:false,
    });
  </script>
  <noscript>
    <div>
      <img src="https://mc.yandex.ru/watch/24049213" style="position:absolute; left:-9999px;" alt="" />
    </div>
  </noscript>
  
    <script type="text/javascript">
      window.addEventListener('load', function () {
        setTimeout(() => {
          const img = new Image();
          img.src = 'https://vk.com/rtrg?p=VK-RTRG-421343-57vKE';
        }, 0);
      });
    </script>
  


<div><div><div class="Vue-Toastification__container top-left"></div></div><div><div class="Vue-Toastification__container top-center"></div></div><div><div class="Vue-Toastification__container top-right"></div></div><div><div class="Vue-Toastification__container bottom-left"></div></div><div><div class="Vue-Toastification__container bottom-center"></div></div><div><div class="Vue-Toastification__container bottom-right"></div></div></div></body></html>